Feature Setting - EDU 教育引导接口文档
概述
EDU (Education) 功能设置模块是 Katana 平台的新用户教育引导系统,用于向 Promoter(推广者)和 Consumer(消费者)展示分步骤的引导流程,帮助用户快速了解平台核心功能。
核心概念
- FeatureName: 功能名称标识符,每个 EDU 功能对应一个唯一的 FeatureName
- FeatureScene: 功能场景,定义了在哪些页面/场景下应该展示哪些 EDU 功能
- PromoterSetting: 推广者个人功能设置,记录用户是否完成某个引导
- FeatureSetting: 全局功能配置,定义功能的默认配置(如引导文案、图片等)
- ConsumerSetting: 消费者功能设置,记录消费者对某个推广者的引导状态
功能优先级规则
系统按顺序返回未完成的引导流程。当前一个流程完成后,才会返回下一个流程。
数据库表结构
model PromoterSetting {
id String @id @db.Uuid
promoterId String @map("promoter_id") @db.Uuid
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz()
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz()
featureName String @default("") @map("feature_name")
settingData Json @default("{}") @map("setting_data")
@@unique([promoterId, featureName])
@@index([promoterId])
}
model FeatureSetting {
id String @id @db.Uuid
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz()
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz()
featureName String @map("feature_name")
enable Boolean @default(true)
featureData Json @default("{}") @map("feature_data")
@@index([featureName])
}
model ConsumerSetting {
id String @id @db.Uuid
consumerId String @map("consumer_id") @db.Uuid
promoterId String? @map("promoter_id") @db.Uuid
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz()
updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz()
featureName String @map("feature_name")
featureData Json @default("{}") @map("feature_data")
@@index([promoterId])
@@index([consumerId])
}
接口列表
| 接口 |
方法 |
描述 |
| [[#1 获取推广者功能设置列表]] |
GET |
根据场景获取待展示的 EDU 功能 |
| [[#2 更新推广者功能设置状态]] |
PATCH |
标记 EDU 功能为已完成 |
| [[#3 获取单个推广者功能设置]] |
GET |
获取指定功能的详细配置 |
1. 获取推广者功能设置列表
根据指定场景获取当前用户待展示的 EDU 功能设置列表。
接口信息
- 请求地址:
/feature-setting/promoter
- 请求方式:
GET
- 需要认证: 是(JWT Token)
| 字段 |
类型 |
必填 |
说明 |
authorization |
string |
是 |
Bearer Token(JWT) |
from |
string |
否 |
来源标识,通常为 client |
origin |
string |
否 |
请求来源域名 |
请求参数(Query)
| 字段 |
类型 |
必填 |
说明 |
scene |
FeatureSettingScene |
是 |
功能场景标识 |
FeatureSettingScene 枚举值
| 枚举值 |
描述 |
SCENE_MY_SHOP |
我的店铺场景 |
SCENE_MARKETPLACE |
市场场景 |
SCENE_CURATOR_PDP |
推广者商品详情页 |
SCENE_CONSUMER_SHOP |
消费者店铺场景 |
SCENE_CONSUMER_PDP |
消费者商品详情页 |
SCENE_GUEST_SHOP |
访客店铺场景 |
SCENE_GUEST_PDP |
访客商品详情页 |
SCENE_EXPLORE |
探索页场景 |
SCENE_QUICK_ACCESS |
快速访问场景 |
SCENE_MY_CATALOG |
我的目录场景 |
响应结构
{
"code": number,
"message": string,
"request_id": string,
"data": {
"[FeatureName]": {
}
}
}
响应字段说明
通用字段
| 字段 |
类型 |
说明 |
code |
number |
状态码,200 表示成功 |
message |
string |
响应消息 |
request_id |
string |
请求追踪 ID |
data |
object |
功能设置数据 |
功能配置字段
| 字段 |
类型 |
说明 |
completed |
boolean |
是否已完成 |
enable |
boolean |
是否启用(功能级控制) |
pass |
boolean |
是否通过白名单验证 |
step1~stepN |
object |
分步骤配置(特定功能) |
cta |
string |
按钮文本 |
backCta |
string |
返回按钮文本 |
title |
string |
标题 |
description |
string |
描述文本 |
成功响应示例
{
"code": 200,
"message": "success",
"request_id": "17840261-7252-428b-8a14-1a0babb0168f",
"data": {
"EDU_INTRODUCE_SHOP": {
"step1": {
"cta": "Next",
"title": "Customize your shop",
"description": "Add your cover image, intro, and social, then adjust colors and fonts to make it your own."
},
"step2": {
"cta": "Next",
"title": "Add new module",
"backCta": "Back",
"description": "Add modules to feature your events, products, or content exactly how you want."
},
"step3": {
"cta": "Next",
"title": "Preview your shop",
"backCta": "Back",
"description": "Preview your storefront exactly as your visitors will see it."
},
"step4": {
"cta": "Got it",
"title": "Introduce content tabs",
"backCta": "Back",
"description": "These tabs are your content library. All posts and links live here until deleted. They're hidden by default and best shared via custom modules."
},
"completed": false,
"enable": true
}
}
}
业务逻辑
flowchart TD
A[开始: GET /feature-setting/promoter] --> B[从 JWT 获取 promoterId]
B --> C{验证用户是否存在}
C -->|不存在| D[抛出 ResourceNotFound]
C -->|存在| E{用户是否为 Promoter}
E -->|否| F[返回空对象 {}]
E -->|是| G[根据 scene 获取功能名称列表]
G --> H[查询所有功能的用户设置]
H --> I[过滤已完成的功能]
I --> J{scene 是否为 SCENE_CURATOR_PDP}
J -->|是| K[返回所有未完成功能]
J -->|否| L[按优先级返回第一个未完成功能]
L --> M[合并全局功能配置数据]
M --> N[检查功能启用状态和白名单]
N --> O[返回结果]
场景与功能映射表
| 场景 |
功能列表(按优先级排序) |
SCENE_MY_SHOP |
EDU_NEW_BUSINESS_PARTNER → EDU_INTRODUCE_SHOP → EDU_REARRANGE_MODULES |
SCENE_MARKETPLACE |
EDU_NEW_CURATOR_COUPON |
SCENE_QUICK_ACCESS |
EDU_SELF_LISTING |
SCENE_CURATOR_PDP |
EDU_IMAGE_DOWNLOAD |
SCENE_CURATOR_MY_LIST |
EDU_FOLLOW_POPUP_OFF → EDU_MY_FOLLOWERS |
SCENE_CONSUMER_SHOP |
EDU_NEW_CONSUMER_COUPON → SUBSCRIPTION_POPUP |
SCENE_CONSUMER_PDP |
EDU_NEW_CONSUMER_COUPON → SUBSCRIPTION_POPUP |
SCENE_GUEST_SHOP |
EDU_GUEST_COUPON → SUBSCRIPTION_POPUP |
SCENE_GUEST_PDP |
EDU_GUEST_COUPON → SUBSCRIPTION_POPUP |
SCENE_EXPLORE |
EDU_INTRODUCE_EXPLORE → EDU_FIRST_POST |
SCENE_PROMOTER_SHOP |
EDU_EXPLORE_PAGE → EDU_RESELL_TOOLTIP |
SCENE_MY_CATALOG |
EDU_CATALOG_SETTING_ICON |
错误响应示例
401 Unauthorized
{
"statusCode": 401,
"message": "Unauthorized"
}
404 Not Found
{
"statusCode": 404,
"message": "Resource not found",
"error": "User not found"
}
注意事项
- 认证要求: 接口需要有效的 JWT Token,从 Token 中提取
userId 作为 promoterId
- 角色校验: 非 Promoter 角色的用户会返回空对象
- 功能优先级: 除
SCENE_CURATOR_PDP 外,其他场景只返回第一个未完成的功能
- 白名单验证: 部分功能可能受白名单限制,未通过验证的用户会自动标记为已完成
- 自动创建: 首次调用时自动创建用户功能设置记录
2. 更新推广者功能设置状态
将指定的 EDU 功能标记为已完成。
接口信息
- 请求地址:
/feature-setting/promoter/{featureName}
- 请求方式:
PATCH
- 需要认证: 是(JWT Token)
| 字段 |
类型 |
必填 |
说明 |
authorization |
string |
是 |
Bearer Token(JWT) |
from |
string |
否 |
来源标识,通常为 client |
origin |
string |
否 |
请求来源域名 |
content-type |
string |
是 |
application/json |
路径参数(Path)
| 字段 |
类型 |
必填 |
说明 |
featureName |
FeatureName |
是 |
功能名称标识 |
请求体(Body)
{
"completed?: boolean",
"triggerDate?: string",
"promoterId?: string",
"id?: string"
}
请求体字段说明
| 字段 |
类型 |
必填 |
说明 |
completed |
boolean |
否 |
是否标记为完成,默认 true |
triggerDate |
string |
否 |
触发日期,ISO 8601 格式 |
promoterId |
string |
否 |
推广者 ID(通常从 JWT 获取,无需传参) |
id |
string |
否 |
功能 ID,用于公告类功能的标记已读 |
响应结构
{
"code": number,
"message": string,
"request_id": string
}
成功响应示例
{
"code": 200,
"message": "success",
"request_id": "989e4eb5-cacb-44aa-b17e-110e3f4c84be"
}
业务逻辑
flowchart TD
A[开始: PATCH /feature-setting/promoter/{featureName}] --> B[从 JWT 获取 promoterId]
B --> C{功能名称是否在 FeatureScene 中}
C -->|否| D[抛出 BadRequestException]
C -->|是| E[查询用户功能设置]
E --> F{设置是否存在}
F -->|否| G[抛出 ResourceNotFound]
F -->|是| H{功能类型判断}
H -->|一次性完成类| I[标记 completed = true]
H -->|显示控制类| J[设置 display = false]
H -->|公告类| K[更新 dismissed 列表]
H -->|计数器类| L[更新日期和计数]
I --> M[保存到数据库]
J --> M
K --> M
L --> M
M --> N[返回成功响应]
功能类型与处理方式
| 功能类型 |
处理方式 |
| CompleteOnce |
设置 completed = true |
| EduDisplay |
设置 display = false |
| DisMiss |
将 ID 添加到 dismissed 数组 |
| DateAndCount |
更新 date 和 count |
错误响应示例
400 Bad Request - 未知功能
{
"statusCode": 400,
"message": "Unknown feature-setting type"
}
404 Not Found
{
"statusCode": 404,
"message": "Resource not found",
"error": "PromoterSetting not found"
}
401 Unauthorized
{
"statusCode": 401,
"message": "Unauthorized"
}
注意事项
- 幂等性: 重复标记已完成的功能不会报错,但会更新数据库记录
- 功能验证: 只有在
FeatureScene 中定义的功能才能被更新
- 自动完成标记: 调用后会将
completed 字段设置为 true
- 公告类功能: 需要传
id 参数来标记具体哪条公告已读
3. 获取单个推广者功能设置
获取指定功能的详细配置,包括全局配置和用户个人设置。
接口信息
- 请求地址:
/feature-setting/promoter/{featureName}
- 请求方式:
GET
- 需要认证: 是(JWT Token)
| 字段 |
类型 |
必填 |
说明 |
authorization |
string |
是 |
Bearer Token(JWT) |
from |
string |
否 |
来源标识,通常为 client |
origin |
string |
否 |
请求来源域名 |
路径参数(Path)
| 字段 |
类型 |
必填 |
说明 |
featureName |
FeatureName |
是 |
功能名称标识 |
响应结构
{
"code": number,
"message": string,
"request_id": string,
"data": {
}
}
成功响应示例
EDU_NEW_BUSINESS_PARTNER 响应
{
"code": 200,
"message": "success",
"request_id": "xxx-xxx-xxx",
"data": {
"completed": false,
"enable": true,
"pass": true,
}
}
EDU_INTRODUCE_SHOP 响应
{
"code": 200,
"message": "success",
"request_id": "xxx-xxx-xxx",
"data": {
"step1": {
"cta": "Next",
"title": "Customize your shop",
"description": "Add your cover image, intro, and social..."
},
"step2": { },
"step3": { },
"step4": { },
"completed": false,
"enable": true
}
}
业务逻辑
flowchart TD
A[开始: GET /feature-setting/promoter/{featureName}] --> B[从 JWT 获取 promoterId]
B --> C{用户角色是否为 CONSUMER}
C -->|是| D[返回 { completed: true }]
C -->|否| E[查询用户功能设置]
E --> F{功能类型特殊处理}
F -->|EDU_NEW_BUSINESS_PARTNER| G[检查用户是否为 Business Partner]
F -->|EDU_SETUP_SHOP| H[检查 shopProfileUpdated 状态]
F -->|EDU_NEW_CURATOR_COUPON| I[检查注册时间是否过期]
F -->|其他| J[使用默认处理]
G --> K{是否满足条件}
H --> K
I --> K
J --> L[返回配置数据]
K -->|不满足| M[返回 { completed: true }]
K -->|满足| L
L --> N[合并全局配置和用户设置]
N --> O[检查功能启用状态]
O --> P[返回最终数据]
特殊功能逻辑
EDU_NEW_BUSINESS_PARTNER
- 显示条件: 用户必须是
BUSINESS_PARTNER 角色
- 自动完成: 非 Business Partner 自动标记为已完成
- 实现代码位置:
src/feature-setting/onboarding/promoter-onboarding.service.ts:232-246
EDU_INTRODUCE_SHOP
- 功能类型: CompleteOnce(一次性完成)
- 步骤配置: 4 个步骤,每个步骤包含
cta、title、description 字段
- 场景:
SCENE_MY_SHOP
EDU_REARRANGE_MODULES
- 显示条件: 用户的 StoreFront 模块数量必须 > 1
- 自动完成: 模块数量 ≤ 1 时自动标记为已完成
- 实现代码位置:
src/feature-setting/onboarding/promoter-onboarding.service.ts:475-492
错误响应示例
400 Bad Request - 未知功能
{
"statusCode": 400,
"message": "EDU_UNKNOWN_FEATURE: Unknown feature name"
}
404 Not Found
{
"statusCode": 404,
"message": "Resource not found",
"error": "FeatureSetting not found"
}
注意事项
- 消费者角色: CONSUMER 角色的用户请求时会直接返回
{ completed: true }
- 自动创建: 首次获取时自动创建用户功能设置记录
- 条件验证: 部分功能会根据用户属性动态判断是否应该显示
FeatureName 枚举说明
EDU - 新用户引导类
| FeatureName |
描述 |
场景 |
EDU_NEW_BUSINESS_PARTNER |
新 Business Partner 引导 |
SCENE_MY_SHOP |
EDU_INTRODUCE_SHOP |
店铺介绍引导(4 步骤) |
SCENE_MY_SHOP |
EDU_REARRANGE_MODULES |
重新排列模块引导 |
SCENE_MY_SHOP |
EDU_REARRANGE_MODULES |
重新排列模块引导 |
SCENE_MY_SHOP |
EDU_NEW_CURATOR_COUPON |
新推广者优惠券引导 |
SCENE_MARKETPLACE |
EDU_NEW_CONSUMER_COUPON |
新消费者优惠券引导 |
SCENE_CONSUMER_SHOP/PDP |
EDU_GUEST_COUPON |
访客优惠券引导 |
SCENE_GUEST_SHOP/PDP |
EDU_IMAGE_DOWNLOAD |
图片下载引导 |
SCENE_CURATOR_PDP |
EDU_SELF_LISTING |
自助上架引导 |
SCENE_QUICK_ACCESS |
EDU_SETUP_SHOP |
店铺设置引导 |
- |
EDU_FOLLOW_POPUP_OFF |
关注弹窗关闭引导 |
SCENE_CURATOR_MY_LIST |
EDU_MY_FOLLOWERS |
我的粉丝引导 |
SCENE_CURATOR_MY_LIST |
EDU_EXPLORE_PAGE |
探索页引导 |
SCENE_PROMOTER_SHOP |
EDU_CREATE_FIRST_POST |
创建首篇帖子引导 |
SCENE_EXPLORE |
EDU_RESELL_FIRST_POST |
转发首篇帖子引导 |
EDU_RESELL_FIRST_POST |
EDU_CATALOG_SETTING_ICON |
目录设置图标引导 |
SCENE_MY_CATALOG |
EDU_RESELL_TOOLTIP |
转发工具提示引导 |
SCENE_PROMOTER_SHOP |
EDU_RESELL_POST |
转发帖子引导 |
EDU_RESELL_POST |
EDU_SHARE_TO_EARN |
分享赚佣金引导 |
EDU_RESELL_POST |
EDU_CHANGE_PRODUCT_STATUS |
更改商品状态引导 |
EDU_CHANGE_PRODUCT_STATUS |
EDU_CHANGE_FOLLOW_EXTERNAL_STATUS |
更改外部关注状态引导 |
EDU_CHANGE_FOLLOW_EXTERNAL_STATUS |
EDU_POST_AFFILIATE_LINKS |
帖子联盟链接引导 |
EDU_POST_AFFILIATE_LINKS |
EDU_CREATE_POST |
创建帖子引导 |
EDU_CREATE_POST |
EDU_POST_ADDING_PRODUCT |
帖子添加商品引导 |
EDU_POST_ADDING_PRODUCT |
EDU_POST_PUBLISHING |
帖子发布引导 |
EDU_POST_PUBLISHING |
EDU_PERSONALIZE_POST |
个性化帖子引导 |
EDU_PERSONALIZE_POST |
EDU_FIRST_POST |
首篇帖子引导 |
EDU_FIRST_POST |
EDU_INTRODUCE_EXPLORE |
探索页介绍引导 |
SCENE_EXPLORE |
EDU_STOREFRONT_THEME |
店铺主题引导 |
EDU_STOREFRONT_THEME |
EDU_POST_RESALE_SETTINGS |
帖子转发设置引导 |
- |
EDU_ACCOUNT_MENU |
账户菜单引导 |
EDU_ACCOUNT_MENU |
订阅类
| FeatureName |
描述 |
场景 |
SUBSCRIPTION |
订阅功能 |
- |
SUBSCRIPTION_POPUP |
订阅弹窗 |
SCENE_CONSUMER_SHOP/PDP |
CURATOR_SUBSCRIPTION |
推广者订阅 |
- |
公告类
| FeatureName |
描述 |
PEAR_ANNOUNCEMENTS |
Pear 平台公告 |
PROMOTER_ANNOUNCEMENTS |
推广者公告 |
PARTNER_ANNOUNCEMENTS |
合作伙伴公告 |
CONSUMER_ANNOUNCEMENTS |
消费者公告 |
注册类
| FeatureName |
描述 |
CONSUMER_SIGNUP |
消费者注册配置 |
PROMOTER_SIGNUP |
推广者注册配置 |
MERCHANT_SIGNUP |
商户注册配置 |
CURATOR_SIGNUP |
推广者注册配置(旧) |
SELF_LISTING_SIGNUP |
自助上架注册配置 |
其他
| FeatureName |
描述 |
CONFIGURABLE_FEATURE |
可配置功能 |
数据结构定义
CompleteOnce(一次性完成)
{
completed: boolean;
}
DateAndCount(日期计数)
{
completed: boolean;
count: number;
date: Date;
}
EduDisplay(显示控制)
{
display: boolean;
}
DisMiss(可关闭)
{
completed: boolean;
dismissed: string[];
}
联合类型,可能是以下类型之一:
CompleteOnce
DateAndCount
EduDisplay
DisMiss
白名单与功能开关
功能开关验证流程
flowchart TD
A[开始功能检查] --> B{查询 FeatureSetting}
B --> C{enable 是否为 true}
C -->|否| D[返回 false - 功能禁用]
C -->|是| E{isWhiteListOn 是否为 true}
E -->|否| F[返回 true - 功能启用]
E -->|是| G{检查 FeatureFlag 白名单}
G -->|用户在白名单| F
G -->|用户不在白名单| D
配置示例
{
"featureName": "EDU_INTRODUCE_SHOP",
"enable": true,
"featureData": {
"isWhiteListOn": false,
"step1": {
"cta": "Next",
"title": "Customize your shop"
}
}
}
使用场景示例
场景 1:新 Business Partner 首次进入我的店铺
curl -X GET 'https://katana-api.1m.app/feature-setting/promoter?scene=SCENE_MY_SHOP' \
-H 'authorization: Bearer {JWT_TOKEN}'
curl -X PATCH 'https://katana-api.1m.app/feature-setting/promoter/EDU_NEW_BUSINESS_PARTNER' \
-H 'authorization: Bearer {JWT_TOKEN}' \
-H 'content-type: application/json' \
-d '{}'
场景 2:完成 EDU_INTRODUCE_SHOP 的 4 步引导
curl -X GET 'https://katana-api.1m.app/feature-setting/promoter/EDU_INTRODUCE_SHOP' \
-H 'authorization: Bearer {JWT_TOKEN}'
curl -X PATCH 'https://katana-api.1m.app/feature-setting/promoter/EDU_INTRODUCE_SHOP' \
-H 'authorization: Bearer {JWT_TOKEN}' \
-H 'content-type: application/json' \
-d '{"completed": true}'
场景 3:处理公告类功能
curl -X GET 'https://katana-api.1m.app/feature-setting/promoter?scene=SCENE_MY_SHOP' \
-H 'authorization: Bearer {JWT_TOKEN}'
curl -X PATCH 'https://katana-api.1m.app/feature-setting/promoter/PEAR_ANNOUNCEMENTS' \
-H 'authorization: Bearer {JWT_TOKEN}' \
-H 'content-type: application/json' \
-d '{"id": "announcement-123"}'
常见问题
Q1: 为什么有些功能没有返回?
A: 可能的原因:
- 功能已完成(
completed = true)
- 功能未启用(
enable = false)
- 用户不在白名单中(
pass = false)
- 功能的显示条件不满足(如
EDU_NEW_BUSINESS_PARTNER 要求用户是 Business Partner)
Q2: 如何判断是否应该显示引导弹窗?
A: 判断逻辑:
- 检查
completed 是否为 false
- 检查
enable 是否为 true
- 检查
pass 是否为 true(如果存在)
- 所有条件满足时应该显示弹窗
Q3: 同一场景多个功能的优先级如何确定?
A: 按 FeatureScene 中定义的数组顺序,数组前面的优先级更高。只有当前一个功能完成后,才会返回下一个功能。
Q4: PATCH 请求需要传什么参数?
A:
- 大多数情况:传空对象
{} 即可,系统自动标记为完成
- 公告类功能:传
{ "id": "announcement-id" } 标记具体公告已读
- 如需延迟完成:传
{ "completed": false }(但不推荐)
Q5: Consumer 角色用户会返回什么?
A: 返回空对象 {} 或 { completed: true },不会显示任何引导内容。
相关文件
| 文件路径 |
说明 |
src/feature-setting/feature-setting.controller.ts |
控制器,定义 API 端点 |
src/feature-setting/feature-setting.service.ts |
服务层,核心业务逻辑 |
src/feature-setting/onboarding/promoter-onboarding.service.ts |
推广者引导功能处理 |
src/feature-setting/consumer/consumer-feature.service.ts |
消费者引导功能处理 |
src/feature-setting/feature-setting.repo.ts |
数据库访问层 |
src/feature-setting/feature.setting.interface.ts |
接口和枚举定义 |
src/database/schema.prisma |
数据库模型定义 |
更新日志
| 日期 |
版本 |
更新内容 |
| 2026-03-03 |
v1.0 |
初始版本,EDU 功能设置接口文档 |